import router from './router'
import { ElMessage } from 'element-plus'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken, setToken } from '@/utils/auth'
import { isHttp } from '@/utils/validate'
import { isRelogin } from '@/utils/request'
import useUserStore from '@/store/modules/user'
import useSettingsStore from '@/store/modules/settings'
import usePermissionStore from '@/store/modules/permission'
import {getAppBaseInfo, ssoLogin} from '@/api/login'
import {tansParams} from "@/utils/zone";

NProgress.configure({ showSpinner: false });

const whiteList = ['/login', '/register'];

router.beforeEach(async (to, from, next) => {
  NProgress.start();
  if (getToken()) {
    to.meta.title && useSettingsStore().setTitle(to.meta.title);
    /* has token*/
    if (to.path === '/login') {
      next({path: '/'});
    } else {
      const nextPath = await getUserInfoThenGotoPath(to);
      next(nextPath);
    }
  } else {
    // 通过接口获取系统基本信息；并且尝试通过cookie 获取token
    const res = await getAppBaseInfo();
    const isSsoEnabled = res.baseInfo?.ssoEnabled;
    if (isSsoEnabled) {
      // 采用单点认证
      const rt = await ssoLogin();
      if (rt?.token) {
        setToken(rt.token);
        const nextPath = await getUserInfoThenGotoPath(to);
        next(nextPath);
      } else {
        // 进入sso认证登录页面
        const toPath = whiteList.includes(to.path) ? '/index' : to.fullPath;
        location.href = getSsoUrl(res.baseInfo, toPath);
      }

    } else if (whiteList.includes(to.path)) {
      // 在白名单，直接进入
      next();
    } else { // 不走sso认证
      next(`/login?redirect=${to.fullPath}`);
    }
  }
  NProgress.done();
})

router.afterEach(() => {

  // 分别遍历让所有的悬浮框隐藏 （页面切换的过程中采用动画效果，页面左移导致鼠标可能移动到原页面的一个tooltips触发上面，
  // 然后这个原页面消失了从而保留下面的tooltips一直在新页面存在；所以需要下面的处理用来关闭原页面的tooltips）
  setTimeout(() => {
    const mypopperList = document.querySelectorAll('.el-popper') // 获取页面所有popper（tooltips）的dom集合
    mypopperList.forEach((value) => {
      value.style.display = 'none'
    })

  }, 800)

  NProgress.done() // 关闭进度条
})

/**
 * 判断是否获取到了用户权限和路由信息，没有获取到尝试获取信息,返回下一步路由。
 * @param to
 */
async function getUserInfoThenGotoPath(to) {
  if (!useUserStore().roles.length) {
    //useUserStore().getTaskAndReadCount();
    isRelogin.show = true;
    try{
      // 判断当前用户是否已拉取完user_info信息
      await useUserStore().getInfo();
      isRelogin.show = false;
      const accessRoutes = await usePermissionStore().generateRoutes();
      // 根据roles权限生成可访问的路由表
      accessRoutes.filter(route => !isHttp(route.path))
        .forEach(route => {
          router.addRoute(route); // 动态添加可访问路由表
        })
    } catch (err) {
      await useUserStore().logOut();
      ElMessage.error(err.message);
    }
    return {...to, replace: true};
  } else {
    return null;
  }
}

/**
 * 获取sso登陆页面的url，后面拼接成功后的跳转地址
 * @param baseInfo  平台信息
 * @param toPath  登陆成功后的跳转path
 * @returns {string}
 */
function getSsoUrl(baseInfo, toPath) {
  const nextPath =  (toPath === '/index/AAA') ? '/index' : toPath;
  const params = {
    uomSystemCode: baseInfo.name,
    successUrl: `${location.protocol}//${location.host}${import.meta.env.VITE_STATIC_BASE_URI}#${nextPath}`
  };

  return baseInfo.ssoUrl + '?' + tansParams(params);
}
